package com.hcss.common.redis.base;

import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @描述: redis Map类型数据操作Dao接口
 * @作者: xuqian
 * @创建日期: 2018-01-15 13:52
 * @公司 浙江鸿程计算机系统有限公司
 */
public interface RedisMapDao<K, T>{

    /**
     * 获取当前使用RedisTemplate
     * @return
     */
    RedisTemplate getRedisTemplate();

    /**
     * 获取当前使用HashOperations
     * @return
     */
    HashOperations getHashOperations();

    /**
     * 清除key对应数据
     * @param key
     */
    void clear(String key);

    /**
     * 清除能匹配上pattern的所有key对应数据
     * @param pattern
     */
    void clearAll(String pattern);

    /**
     * 向key对应map集合插入数据
     * @param key
     * @param mkey
     * @param mvalue
     */
    void put(String key, K mkey, T mvalue);

    /**
     * 插入全部数据
     * @param key
     * @param map
     */
    void putAll(String key, Map<K, T> map);

    /**
     * 从key对应map中获取mkey对应值
     * @param key
     * @param mkey
     * @return
     */
    T get(String key, K mkey);

    /**
     * 根据mkeys获取一组值
     * @param key
     * @param mkeys
     * @return
     */
    List<T> get(String key, K... mkeys);

    /**
     * 获取key对应全部map集合
     * @param key
     * @return
     */
    Map<K, T> getAll(String key);

    /**
     * 根据不定个数mkeys删除值
     * @param key
     * @param mkeys
     */
    void delete(String key, K... mkeys);

    /**
     * 判断是否存在mkey
     * @param key
     * @param mkey
     * @return
     */
    boolean contantsKey(String key, K mkey);

    /**
     * 获取key对应map对象的key集合
     * @param key
     * @return
     */
    Set<K> getKeys(String key);

    /**
     * 获取key对应map对象的value集合
     * @param key
     * @return
     */
    List<T> getValues(String key);

    /**
     * 获取key对应map对象的大小
     * @param key
     * @return
     */
    Long size(String key);

    /**
     * 设置key对应失效时间
     * @param key
     * @param time
     * @param unit
     */
    void setTime(String key, long time, TimeUnit unit);
    
    /**
     * 根据传入的带有通配符的key查询出redis客户端可以使用的key的集合
     * @param fuzzyKey
     * @return
     */
    Set<String> fuzzyKeys(String fuzzyKey) ;
    
}
